//
//  ViewController.m
//  02-掌握-RunLoop实践
//
//  Created by J on 16/1/27.
//  Copyright © 2016年 J. All rights reserved.
//

#import "ViewController.h"
#import "Thread.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (strong, nonatomic)  Thread *thread;


@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    Thread* thread = [[Thread alloc]initWithTarget:self selector:@selector(run) object:nil];
    self.thread = thread;

    [self.thread start];//线程任务执行完就处于消亡状态  attempt to start the thread again'

}


//- (void)run{
//    
//        NSLog(@"%@",[NSThread currentThread]);
//    
////    while (1) {//此方法runLoop会一直进入退出 不会休眠
////        [[NSRunLoop currentRunLoop]run];
////    }
//        NSLog(@"------");
//
//    
//}

//虽然线程不死 但是会一直处理while(1);无法处理其他行为(事件)
//- (void)run{
//    
//    NSLog(@"%@",[NSThread currentThread]);
////    while (1);//当前线程永远在处理这行代码
//  
//    NSLog(@"------");
//
//}

- (void)run{
    while (1) {
        
        [[NSRunLoop currentRunLoop]run];//如果当前模式中没有任何Source、Timer、Observer直接退出RunLoop
        NSLog(@"%@",[NSRunLoop currentRunLoop]);

    }
   
//    entries =>
//    1 : <CFRunLoopMode 0xbf13390 [0x1228098]>{name = kCFRunLoopDefaultMode, port set = 0x5207, timer port = 0x5107,
//        sources0 = (null),
//        sources1 = (null),
//        observers = (null),
//        timers = (null),
//        currently 475785596 (129531708615059) / soft deadline in: 1.84466145e+10 sec (@ -1) / hard deadline in: 1.84466145e+10 sec (@ -1)
//    },
}
//- (void)run{//让线程常驻内存 不会消亡
//    
//    @autoreleasepool {
//        
//        NSLog(@"%s %@",__FUNCTION__,[NSThread currentThread]);
//        [[NSRunLoop currentRunLoop]addPort:[NSPort port] forMode:NSDefaultRunLoopMode];//port相当于source
//        //    [NSRunLoop currentRunLoop]removePort:<#(nonnull NSPort *)#> forMode:<#(nonnull NSString *)#>;//移除port Loop就会退出
//        [[NSRunLoop currentRunLoop] run];//从这句开始开启runLoop无限循环 下面一句就不会再执行了
//        NSLog(@"xx");
//        
//        //    [[NSRunLoop currentRunLoop]runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
//        //    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantFuture]];
//    }
//    
//}

- (void)test{
//    NSLog(@"%s %@",__FUNCTION__,[NSThread currentThread]);
    NSLog(@"%@",[NSRunLoop currentRunLoop]);	//sources1 = <CFBasicHash 0xca57610 [0x1233098]>{type = mutable set, count = 0,set集合类


    
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
 
    [self performSelector:@selector(test) onThread:self.thread withObject:nil waitUntilDone:NO];
//    [self.thread start];//线程任务执行完就处于消亡状态  attempt to start the thread again'

}

- (void)useImageView{
    //只在NSDefaultRunLoopMode 模式下显示图片 如果滚动textView不显示图片 因为滚动时候处于UITrackingRunLoopMode  默认情况下3s后显示图片
    [self.imageView performSelector:@selector(setImage:) withObject:[UIImage imageNamed:@"22"] afterDelay:3.0 inModes:@[NSDefaultRunLoopMode]];

    
}

//RunLoop
//什么是RunLoop?
/*从字面意思看:运行循环
其实它内部是一个do-while循环在这个循环内部不断处理各种事件(比如Source、Timer、Observer)
一个线程对应一个RunLoop、主线程RunLoop默认已经启动、子线程需要手动启动  [[NSRunLoop currentRunLoop] run];
 RunLoop只能选择一个Mode启动,如果当前模式中没有任何Source、Timer、Observer直接退出RunLoop
 */
//你在开发中怎么使用RunLoop?
/*
 开启一个常驻线程(让一个子线程不进入消亡状态,等待其他线程发来消息,处理其他事件)
 在子线程中开启一个定时器
 在子线程中长期监控一些行为
 可以控制定时器在哪种模式下运行
 可以让某些时间(行为、任务)在特定模式下执行//performselector in mode
 可以添加Observer监听RunLoop的状态、比如监听点击事件的处理(在所有点击事件之前做一些事情)
 */
//自动释放池什么时候释放?
//在RunLoop睡眠之前释放 kCFRunLoopBeforeWaiting
//在开发中什么场景使用RunLoop


@end
